#ifndef __LIST_ONE_WAY_H__
#define __LIST_ONE_WAY_H__
#include "ds_common.h"

typedef struct ListO_Node ListO_Node;
typedef ListO_Node *PListO_Node;
typedef const ListO_Node *CPListO_Node;

typedef struct ListO ListO;
typedef ListO *PListO;
typedef const ListO *CPListO;


struct ListO_Node
{
    PListO_Node next;
    PData_Val data;
};

//绑定用于比较两个元素是否相等的函数
//若两个参数相等，equal应返回true
void listo_bind_equal(PListO thisc, bool (*equal)(PData_Val, PData_Val));

//绑定用于比较两个元素的大小的函数
//若第一个参数小于第二个参数，less应返回true
void listo_bind_less(PListO thisc, bool (*less)(PData_Val, PData_Val));

//创建并返回一个双向链表
PListO listO_creat(int sizeof_type);

//销毁链表
void listO_destory(PListO thisc);

//返回指向容器中第一个元素的双向迭代器。
PListO_Node listo_begin(PListO thisc);

//返回指向容器中最后一个元素所在位置的双向迭代器。
PListO_Node listo_end(PListO thisc);

//和 begin() 功能相同，只不过在其基础上，增加了 const 属性，不能用于修改元素。
CPListO_Node listo_cbegin(PListO thisc);

//和 end() 功能相同，只不过在其基础上，增加了 const 属性，不能用于修改元素。
CPListO_Node listo_cend(PListO thisc);

//判断容器中是否有元素，若无元素，则返回 true；反之，返回 false。
bool listo_empty(PListO thisc);

//返回当前容器实际包含的元素个数。
int listo_size(PListO thisc);

//返回第一个元素的引用。
CPData_Val listo_front(PListO thisc);

//返回最后一个元素的引用。
CPData_Val listo_back(PListO thisc);

//在容器头部插入一个元素。
void listo_push_front(PListO thisc, CPData_Val data);

//在容器尾部插入一个元素。
void listo_push_back(PListO thisc, CPData_Val data);

//删除容器头部的一个元素。
void listo_pop_front(PListO thisc);

//删除容器尾部的一个元素。
void listo_pop_back(PListO thisc);

//在容器中的指定位置前插入元素。
void listo_insert(PListO thisc, PListO_Node location, CPData_Val data);

//删除容器中一个元素。
void listo_erase(PListO thisc, PListO_Node location);

//删除容器中某区域内的元素。
void listo_erase_as(PListO thisc, PListO_Node begin, PListO_Node end);

//删除容器中所有等于 val 的元素。
//使用前应调用listo_bind_equal()函数绑定比较函数
void listo_remove(PListO thisc, PData_Val val);

//删除容器中满足条件的元素。
void listo_remove_if(PListO thisc, bool (*factor)(PData_Val));

//删除容器中相邻的重复元素，只保留一个。
//使用前应调用listo_bind_equal()函数绑定比较函数
void listo_unique(PListO thisc);

//合并两个事先已排好序的 listo 容器，并且合并之后的 listo 容器依然是有序的。
//使用前应调用listo_bind_less()函数绑定比较函数
PListO listo_merge(PListO listo_r, PListO listo_f);

//通过更改容器中元素的位置，将它们进行排序。
//使用前应调用listo_bind_less()函数绑定比较函数
void listo_sort(PListO thsic);

//反转容器中元素的顺序。
void listo_reverse(PListO thisc);

//反转容器中元素的顺序。
void listo_reverse1(PListO thisc);

#endif//__LIST_ONE_WAY_H__